home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-06-19 | 4.1 KB | 189 lines | [TEXT/MPS ] |
- # ptmf.s - pointer-to-member-function support for Metrowerks C++ for PowerPC
- #
- # Copyright © 1993 metrowerks inc. All Rights Reserved.
- #
- #
- # THEORY OF OPERATION
- #
- # A pointer-to-member-function (PTMF) is represented as a 3-word struct:
- #
- # +-----------------------------+ +-----------------------------+
- # | 'this' delta | | 'this' delta |
- # |-----------------------------| |-----------------------------|
- # | -1 | | vtbl index |
- # |-----------------------------| |-----------------------------|
- # | function pointer | | vptr offset |
- # +-----------------------------+ +-----------------------------+
- #
- #
- # BUILD INSTRUCTIONS
- #
- # To assemble this file:
- #
- # ppcasm ptmf.s -o ptmf.o
- #
- # The object file runtime.o can be added directly to any CodeWarrior™ project.
- #
-
- dialect powerpc
-
- #
- # Assembler Equates
- #
- cr0 equ 0
- cr1 equ 1
- cr2 equ 2
- cr3 equ 3
- cr4 equ 4
- cr5 equ 5
- cr6 equ 6
- cr7 equ 7
-
- #
- # PTMF Equates
- #
- this_delta equ 0
- vtbl_index equ 4
- vptr_offset equ 8
-
-
- #
- # Public Data
- #
- csect __ptmf_null{RO}
- export __ptmf_null{RO}
- dc.l 0, 0, 0
-
-
- # __ptmf_test - test pointer-to-member-function for null
- #
- # R3 contains the PTMF. If it is null, we return 0; else we return 1.
- #
- csect .__ptmf_test{PR}
- export .__ptmf_test{PR}
- lwz r5,this_delta(r3)
- lwz r6,vtbl_index(r3)
- lwz r7,vptr_offset(r3)
- li r3,1
- cmpi cr0,r5,0
- cmpi cr6,r6,0
- cmpi cr7,r7,0
- bnelr cr0
- bnelr cr6
- bnelr cr7
- li r3,0
- blr
-
-
- # __ptmf_cmpr - compare two pointer-to-member-functions
- #
- # R3 and R4 contain the PTMFs. If equal, we return 0; else we return 1.
- #
- csect .__ptmf_cmpr{PR}
- export .__ptmf_cmpr{PR}
- lwz r5,this_delta(r3)
- lwz r6,this_delta(r4)
- lwz r7,vtbl_index(r3)
- lwz r8,vtbl_index(r4)
- lwz r9,vptr_offset(r3)
- lwz r10,vptr_offset(r4)
- li r3,1
- cmp cr0,r5,r6
- cmp cr6,r7,r8
- cmp cr7,r9,r10
- bnelr cr0
- bnelr cr6
- bnelr cr7
- li r3,0
- blr
-
-
- # __ptmf_call - call pointer-to-member-function
- #
- # R12 contains the PTMF. R3 contains 'this'.
- #
- csect .__ptmf_call{GL}
- export .__ptmf_call{GL}
- lwz r0,this_delta(r12)
- lwz r11,vtbl_index(r12)
- lwz r12,vptr_offset(r12) # function pointer if not virtual
- cmpi cr0,r11,0
- add r3,r3,r0 # adjust 'this'
- blt cr0,@1
- lwzx r12,r3,12 # get vptr
- add r12,r12,r11 # point to vtbl entry
- lwz r0,4(r12) # get 'this' delta
- lwz r12,0(r12) # get function pointer
- add r3,r3,r0 # adjust 'this' again
- @1 lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-
-
- # __ptmf_call4 - call pointer-to-member-function, 'this' in R4
- #
- # R12 contains the PTMF. R4 contains 'this'.
- #
- csect .__ptmf_call4{GL}
- export .__ptmf_call4{GL}
- lwz r0,this_delta(r12)
- lwz r11,vtbl_index(r12)
- lwz r12,vptr_offset(r12) # function pointer if not virtual
- cmpi cr0,r11,0
- add r4,r4,r0 # adjust 'this'
- blt cr0,@1
- lwzx r12,r4,12 # get vptr
- add r12,r12,r11 # point to vtbl entry
- lwz r0,4(r12) # get 'this' delta
- lwz r12,0(r12) # get function pointer
- add r4,r4,r0 # adjust 'this' again
- @1 lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-
-
- # __ptmf_scall - call pointer-to-member-function
- #
- # This is used when we know the class tree uses single inheritance only.
- # R12 contains the PTMF. R3 contains 'this'.
- #
- #
- csect .__ptmf_scall{GL}
- export .__ptmf_scall{GL}
- lwz r11,vtbl_index(r12)
- lwz r12,vptr_offset(r12) # function pointer if not virtual
- cmpi cr0,r11,0
- blt cr0,@1
- lwzx r12,r3,12 # get vptr
- lwzx r12,r12,r11 # get function pointer
- @1 lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-
-
- # __ptmf_scall4 - call pointer-to-member-function
- #
- # This is used when we know the class tree uses single inheritance only.
- # R12 contains the PTMF. R4 contains 'this'.
- #
- #
- csect .__ptmf_scall4{GL}
- export .__ptmf_scall4{GL}
- lwz r11,vtbl_index(r12)
- lwz r12,vptr_offset(r12) # function pointer if not virtual
- cmpi cr0,r11,0
- blt cr0,@1
- lwzx r12,r4,12 # get vptr
- lwzx r12,r12,r11 # get function pointer
- @1 lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-